package cn.kgc.jdktest.demo10;

import com.google.common.base.Charsets;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;

/**
 * @Author:yaozhaobao
 * @Description:TODO
 * @version:1.0
 */
@Data
@Slf4j
public class test6 {


//    public static void main(String[] args) {
//        int total = 1000000; // 总数量
//
//        BloomFilter<CharSequence> bf = BloomFilter.create(
//                Funnels.stringFunnel(Charsets.UTF_8), total,0.0002
//        );
//        // 初始化 1000000 条数据到过滤器中
//        for (int i = 0; i < total; i++) {
//            bf.put("" + i);
//        }
//
//
//        // 判断值是否存在过滤器中  遍历1010000
//        int count = 0;
//        for (int i = 0; i < total + 10000; i++) {
//            if (bf.mightContain("" + i)) {
//                count++;
//            }
//        }
//        System.out.println("已匹配数量 " + count);
//    }

    /**
     * 初始化布隆过滤器
//     */
    public static void main(String[] args) {
        // 初始化布隆过滤器，设置数据类型，数组长度和误差值
        BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charsets.UTF_8), 1000000L, 0.01);
        // 获取要装入过滤器的数据   获取热门的数据
        Integer[] itemids={1,2,3,4,5,6,7,8,9,10};

        List<Integer> hotkey = Arrays.asList(itemids);
        // 循环装填
        for (Integer key : hotkey) {
            bloomFilter.put("dm:host:item:" +key);
            log.info("已加入数据到布隆过滤器key:"+key);
        }
        log.info("布隆过滤器装载完成");



        for (int i = 0; i < 10; i++) {
            //查询 id= 11的数据
            //先查询redis
            if(!bloomFilter.mightContain("dm:host:item:"+11)){
                System.out.println("redis中没有这个数据，避免缓存传统不查询redis");
                continue;
            }

            //模拟redis 不存在这个数据
            if(10!=11){
                //数据库查询
                System.out.println("redis 查询为空，数据库查询"+i);
                System.out.println("数据也没有这个11，没办法存到redis中"+i);
                if(11==11){
                    //数据库存在数据
                    bloomFilter.put("dm:host:item:" +11);
                }
            }
        }

    }


}
